home *** CD-ROM | disk | FTP | other *** search
/ Die Ultimative Software-P…i Collection 1996 & 1997 / Die Ultimative Software-Pakete CD-ROM fur Atari Collection 1996 & 1997.iso / d / diskmoni / templm18 / trace.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-11-17  |  5.6 KB  |  148 lines

  1. /*******************************************************************
  2.  * Dieses Programm dient als Debug-Hilfe zum Debugger TEMPLEMON
  3.  * von Thomas Tempelmann, E.-L.-Kirchner Str. 25, 2900 Oldenburg.
  4.  * Es wurde mit dem MEGAMAX C Entwicklungssystem erstellt.
  5.  * Das Programm (ohne die besonders markierten spezifischen Programm-
  6.  * abschnitte fuer das Beispielprogramm TRACE.TOS) kann als Rumpf
  7.  * fuer alle weiteren User-Trace Routinen dienen.
  8.  ******************************************************************/
  9.  
  10. /* Allg. includes */
  11.  
  12. #include <osbind.h>
  13.  
  14. /* spezifische Konstante fuer Zugriffe auf die Prozessorregister */
  15.  
  16. #define  RegD0  04(A0)
  17. #define  RegD1  08(A0)
  18. #define  RegD2  12(A0)
  19. #define  RegD3  16(A0)
  20. #define  RegD4  20(A0)
  21. #define  RegD5  24(A0)
  22. #define  RegD6  28(A0)
  23. #define  RegD7  32(A0)
  24. #define  RegA0  36(A0)
  25. #define  RegA1  40(A0)
  26. #define  RegA2  44(A0)
  27. #define  RegA3  48(A0)
  28. #define  RegA4  52(A0)
  29. #define  RegA5  56(A0)
  30. #define  RegA6  60(A0)
  31. #define  RegA7  64(A0)
  32. #define  RegSR  02(A0)
  33. #define  RegPC  68(A0)
  34. #define  RegUSP 80(A0)
  35. #define  RegSSP 84(A0)
  36.  
  37. #define  StopTrace D0
  38.  
  39. /* Allg. Definitionen */
  40.  
  41. #define  TRUE   1
  42. #define  FALSE  0
  43.  
  44.  
  45. /******************** User - Trace Routine ***************************/
  46.  
  47. static _usrTrc();
  48.  
  49. asm {
  50. _usrTrc:    ;Hier ist der Einsprungspunkt fuer die User-Trace Routine.
  51.             ;Hier koennen Abfragen in Assembler programmiert werden.
  52.             ;Die augenblicklichen Register A0 und D7 duerfen nicht
  53.             ;veraendert werden; in D0.W wird Nicht-Null oder Null zu-
  54.             ;rueckgegeben, je nachdem, ob das Tracing abgebrochen wer-
  55.             ;densoll oder ob weitergetraced werden soll.
  56.             ;Auf die im Debugger zwischengespeicherten Register der
  57.             ;CPU fuer die naechste auszufuehrende Instruktion kann
  58.             ;mit den obigen Definitionen (Reg..) zugegriffen werden.
  59.             ;Die Register (Reg..) koennen auch veraendert werden.
  60.             ;Dieses Programm wird immer im Supervisormodus aufgerufen.
  61.             ;
  62.             ;Z.B. kann eine Ueberpruefung, ob als naechste Instruktion
  63.             ;ein Line-A Aufruf stattfindet, folgendermassen program-
  64.             ;miert werden :
  65.             ;
  66.             ; CLR.W   StopTrace  ;D0.W erstmal ruecksetzen...
  67.             ; MOVE.L  RegPC,A1   ;PC laden
  68.             ; MOVE.W  (A1),D1    ;Instruktion laden
  69.             ; ANDI.W  #0xF000,D1 ;oberstes Nibble der Instr. maskieren
  70.             ; CMPI.W  #0xA000,D1 ;Line-A Instruktion ?
  71.             ; SEQ     StopTrace  ;je nachdem D0.B auf 0 oder -1 setzen
  72.             ; RTS                ;zurueck zum Monitor
  73.             ;
  74.             
  75.             /**** Beispiel-Text f. TRACE.TOS ******/
  76.             
  77.              CLR.W   StopTrace
  78.              MOVE.L  0x44E,A1     ;Adr. des Bildschirmbereichs
  79.              TST.W   640(A1)      ;Sind die Bits der ersten 8 Spalten
  80.                                   ;in der zweiten Zeile geloescht ?
  81.              SNE     StopTrace    ;Wenn nicht, dann Stop
  82.              RTS
  83.  
  84. }
  85.  
  86.  
  87. install_trace()
  88. {
  89.     asm{
  90.         LEA     _usrTrc(PC),A0     ; Adr. der Traceroutine
  91.         MOVE.L  A0,0x3F0           ; in User-Trace Vektor ablegen
  92.     }
  93.     
  94.     /**********************************************************
  95.      * Hier folgt evtl. Anwenderspezifischer Code f. weitere  *
  96.      * Initialisierungen :                                    *
  97.      **********************************************************/
  98.     
  99. }
  100.  
  101.  
  102. long keep, prgtop;
  103. extern char *_base;
  104.  
  105. main()
  106. {
  107.     
  108.     Supexec(install_trace);   /* Trace-Routine installieren */
  109.     
  110.     /******* Text f. Beispielprogramm TRACE.TOS : *******/
  111.       
  112.       /* ACHTUNG: dieser Text ist ausgeklammert !
  113.         printf("\nDrücken Sie gleich ALT/HELP, wenn Sie im Desktop sind.\n");
  114.         printf("Dadurch gelangen Sie in den Monitor, vorausgesetzt, er wurde vorher\n");
  115.         printf("durch einen Aufruf (z.B. im Auto-Ordner) initialisiert.\n");
  116.         printf("Mit den Tasten F1 und F2 können Sie dann zwischen dem Monitor- und dem\n");
  117.         printf("normalen Bildschirm hin- und herschalten.\n");
  118.         printf("Geben Sie dann 'T+' ein. Damit wird der Tracemodus eingeschaltet.\n");
  119.         printf("Danach geben Sie 'G' ein, um das unterbrochene Programm (das Desktop-Programm)\n");
  120.         printf("weiterlaufen zu lassen.\n");
  121.         printf("Dann wird nochmal auf einen Tastendruck gewartet, worauf Sie dann\n");
  122.         printf("die Taste 'A' drücken sollen.\n");
  123.         printf("Nun läuft wieder das Desktop-Programm, allerdings nicht mehr ganz so\n");
  124.         printf("schnell, wie man das eigentlich von einer 68000 erwartet...\n");
  125.         printf("Nun sollten Sie die Zeit nutzen, um ein bischen herumzuspielen.\n");
  126.         printf("Wenn Sie genug haben, gehen Sie mit dem Mauscursor nach links oben. Das erkennt\n");
  127.         printf("dann dieses User-Trace Programm und der Monitor meldet sich zurück.\n");
  128.         printf("Mit '?' bekommen Sie im Monitor eine kurze Anleitung !\n");
  129.         printf("Mit 'T-' und 'G' können Sie den Monitor wieder normal verlassen"); 
  130.         printf("\nBitte nun erstmal die SPACE-Taste drücken...\n");
  131.         Cconin();
  132.       */
  133.     
  134.     
  135.     /**********************************************************
  136.      * Programm beenden, aber Speicher dieses Programms nicht *
  137.      * freigeben :                                            *
  138.      **********************************************************/
  139.     asm {
  140.         MOVE.L  A7,prgtop(A4)
  141.     }
  142.     keep = ( prgtop + 0x100 ) - (long) _base;
  143.     Ptermres( keep, 0 );
  144. }
  145.  
  146. /* Ende des Programms */
  147.  
  148.